﻿using System;
using System.Collections.Generic;
using System.Data;
using accesoDatos;

namespace Logica
{
    public class ItemFormula : EntidadAlmacenable
    {
        /* --------------------- Atributos de la clase. Recordar que hay atributos heredados --------------------- */
        private int idMateriaPrima = 0, idFormula = 0, idFase = 0, numeroOrden = 0, numeroOrdenInterno = 0;
        private decimal cantidad = 0;
        private MateriaPrima objMateriaPrima;
        private FaseItem objFase;

        public const string tablaBD = "itemformula", columnaID = "id";


        /* --------------------- Propiedades --------------------- */
        public int ID
        {
            get { return this.id; }
            set { this.id = value; }
        }

        public decimal Cantidad
        {
            get { return this.cantidad; }
            set { this.cantidad = value; }
        }

        public int IdFormula
        {
            get { return this.idFormula; }
            set { this.idFormula = value; }
        }

        public int NumeroOrden
        {
            get { return this.numeroOrden; }
            set { this.numeroOrden = value; }
        }

        public int NumeroOrdenInterno
        {
            get { return this.numeroOrdenInterno; }
            set { this.numeroOrdenInterno = value; }
        }

        public MateriaPrima ObjMateriaPrima
        {
            get { return objMateriaPrima; }
            set {
                objMateriaPrima = value;
                this.idMateriaPrima = this.objMateriaPrima.ID;
            }
        }

        public FaseItem ObjFase
        {
            get { return objFase; }
            set
            {
                objFase = value;
                this.idFase = this.objFase.ID;
            }
        }

        public string NombreMateriaPrima
        {
            get { return this.objMateriaPrima.Nombre.Trim(); }
        }

        public string NombreUnidad
        {
            get { return this.objMateriaPrima.ObjUnidadMedida.Nombre.Trim(); }
        }


        /* --------------------- Constructores --------------------- */
        public ItemFormula()
            : this(0) // Llamo al constructor que recibe un parámetro para reutilizar el código del mismo
        { }

        /* IMPORTANTE:
             ** Si el campo identificador unívoco de la tabla actual tuviese un nombre distinto de "id", se lo debe setear en este momento
             * (atributo heredado: nombreColumnaID)
             ** Si el campo identificador unívoco NO se generase automáticamente, se lo debe definir en este momento, cambiando el atributo
             * heredado idAutoGenerado por FALSE.
             */
        public ItemFormula(int idElem)
            : base() // Llamo al constructor padre en primer lugar, para inicializar los valores correspondientes
        {
            // Es importante esta asignación ya que estos valores se utilizan tanto en métodos del objeto padre como éste
            this.nombreTablaBD = tablaBD;
            this.nombreColumnaID = columnaID;
            this.id = idElem;

            // Si se hubiese enviado un id != 0, entonces se buscan los datos del elemento en la BD para cargarlos al objeto actual que se está creando
            if (this.id != 0)
            {
                DataRow elemento = this.buscarElemento(id);
                try
                {
                    this.cantidad = Convert.ToDecimal(elemento["cantidad"]);
                    this.idMateriaPrima = Convert.ToInt32(elemento["idMateriaPrima"]);
                    this.idFormula = Convert.ToInt32(elemento["idFormula"]);
                    this.idFase = Convert.ToInt32(elemento["idFase"]);
                    this.numeroOrden = Convert.ToInt32(elemento["numeroOrden"]);
                    this.numeroOrdenInterno = Convert.ToInt32(elemento["numeroOrdenInterno"]);
                }
                catch (Exception ex)
                {
                    this.error = ex.Message;
                }
            }

            this.objMateriaPrima = new MateriaPrima(this.idMateriaPrima);
            this.objFase = new FaseItem(this.idFase);
        }


        /* --------------------- Métodos --------------------- */
        public static List<ItemFormula> listar(String[] columnasFiltros, String[] valoresFiltros)
        {
            List<ItemFormula> listado = new List<ItemFormula>();
            DataTable tabla = EntidadAlmacenable.listarElementos(tablaBD, columnasFiltros, valoresFiltros);
            try
            {
                foreach (DataRow fila in tabla.Rows)
                {
                    ItemFormula elemento = new ItemFormula(Convert.ToInt32(fila[columnaID]));
                    listado.Add(elemento);
                }
            }
            catch (Exception ex)
            {
            }

            return listado;
        }

        public String guardar()
        {
            String[] columnas = new String[] { columnaID, "cantidad", "idMateriaPrima", "idFormula", "idFase", "numeroOrden", "numeroOrdenInterno" };
            String[] valores = new String[] { this.id.ToString(), this.cantidad.ToString(), this.idMateriaPrima.ToString(), this.idFormula.ToString(), 
                this.idFase.ToString(), numeroOrden.ToString(), numeroOrdenInterno.ToString() };

            return base.guardarElemento(columnas, valores);
        }
    }
}
